package containers;

//: containers/SetPerformance.java
// Demonstrates performance differences in Sets.
// {Args: 100 5000} Small to keep build testing short
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class SetPerformance {
	static List<Test<Set<Integer>>> tests = new ArrayList<Test<Set<Integer>>>();
	static {
		tests.add(new Test<Set<Integer>>("add") {
			int test(Set<Integer> set, TestParam tp) {
				int loops = tp.loops;
				int size = tp.size;
				for (int i = 0; i < loops; i++) {
					set.clear();
					for (int j = 0; j < size; j++)
						set.add(j);
				}
				return loops * size;
			}
		});
		tests.add(new Test<Set<Integer>>("contains") {
			int test(Set<Integer> set, TestParam tp) {
				int loops = tp.loops;
				int span = tp.size * 2;
				for (int i = 0; i < loops; i++)
					for (int j = 0; j < span; j++)
						set.contains(j);
				return loops * span;
			}
		});
		tests.add(new Test<Set<Integer>>("iterate") {
			int test(Set<Integer> set, TestParam tp) {
				int loops = tp.loops * 10;
				for (int i = 0; i < loops; i++) {
					Iterator<Integer> it = set.iterator();
					while (it.hasNext())
						it.next();
				}
				return loops * set.size();
			}
		});
	}

	public static void main(String[] args) {
		if (args.length > 0)
			Tester.defaultParams = TestParam.array(args);
		Tester.fieldWidth = 10;
		Tester.run(new TreeSet<Integer>(), tests);
		Tester.run(new HashSet<Integer>(), tests);
		Tester.run(new LinkedHashSet<Integer>(), tests);
	}
} /* Output: (Sample)
------------- TreeSet -------------
size       add  contains   iterate
 10       746       173        89
100       501       264        68
1000       714       410        69
10000      1975       552        69
------------- HashSet -------------
size       add  contains   iterate
 10       308        91        94
100       178        75        73
1000       216       110        72
10000       711       215       100
---------- LinkedHashSet ----------
size       add  contains   iterate
 10       350        65        83
100       270        74        55
1000       303       111        54
10000      1615       256        58
*///:~
